#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){
	int x=0;bool f=0;char ch=getchar();
	while(ch<'0'||ch>'9')f^=(ch=='-'),ch=getchar();
	while('0'<=ch&&ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
	return f?-x:x;
}
const int Maxn=1e5+5,inf=1e18;
int n,m,q;
int c[Maxn];
int a[Maxn][10];
int f[505][505][6][2][2];
int sum[Maxn][6];
signed main(){
	freopen("paint3.in","r",stdin);
//	freopen("paint.out","w",stdout);
	n=read();m=read();q=read();
	for(int i=1;i<=n;i++)c[i]=read();
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			a[i][j]=read();
		}
		for(int j=1;j<=m;j++)
			f[i][i][j][0][0]=a[i][c[i]],f[i][i][j][1][1]=a[i][j],f[i][i][j][0][1]=f[i][i][j][1][0]=-inf;
		f[i][i][c[i]][0][1]=f[i][i][c[i]][1][0]=a[i][c[i]];
	}
	for(int len=2;len<=n;len++){
		for(int l=1;l+len-1<=n;l++){
			int r=l+len-1;
			int val=0;
			for(int k=l+1;k<=r;k++){
				for(int j=1;j<=m;j++){
					for(int g=1;g<=m;g++)
						val=max(val,f[l][k-1][j][0][0]+f[k][r][g][0][0]);
					val=max(val,f[l][k-1][j][0][1]+f[k][r][j][1][0]);
				}
			}
			for(int j=1;j<=m;j++){
				f[l][r][j][0][0]=val;
				for(int k=l+1;k<=r;k++)
					for(int x=0;x<2;x++)for(int y=0;y<2;y++)for(int g=0;g<2;g++)
						f[l][r][j][x][y]=max(f[l][r][j][x][y],f[l][k-1][j][x][g]+f[k][r][j][g][y]);
			}
		}
	}
	printf("%lld\n",f[1][n][1][0][0]);
	return 0;
}
/*
3 2 4
2 1 2
4 4
2 4
3 1
2 8 10
1 11 8
2 10 10
1 0 0

5 3 6
2 1 3 1 3
5 7 3
7 3 4
7 4 5
4 6 6
4 7 7
2 33 37
1 33 33
2 34 36
1 17 16
2 16 23
1 28 26


4 3 0
1 2 1 3
7 3 4
7 4 5
4 6 6
4 7 7
*/
